home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / tcp_ip / tnos / tnos100s / sort.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-06  |  5.0 KB  |  250 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <io.h>
  4. #include <time.h>
  5. #include <alloc.h>
  6. #include <stdlib.h>
  7.  
  8.  
  9. struct entries {
  10.     char *name;
  11.     int index;
  12. };
  13.  
  14. extern char *skipwhite (char *cp);
  15. struct entries *e;
  16. static int current, count;
  17. static char name[16];
  18. static int start, result, index, same;
  19. int sortdups, wassorted, expired;
  20.  
  21. static void
  22. search ()
  23. {
  24. int k;
  25.  
  26.     same = 0;
  27.     for (index = 0; index < count; index++)        {
  28.         result = stricmp (name, e[index].name);
  29.         if (!result)    {
  30.             same = 1;
  31.             sortdups++;
  32.             return;
  33.         }
  34.         if (result < 0)
  35.             return;
  36.     }
  37.     return;
  38. }
  39.  
  40.  
  41. static void
  42. insert ()
  43. {
  44. unsigned k;
  45.  
  46.     for (k = count; k > index; k--)    {
  47.         strcpy (e[k].name, e[k - 1].name);
  48.         e[k].index = e[k - 1].index;
  49.     }
  50.     strcpy (e[k].name, name);
  51. #ifdef TEST
  52.     if (count)
  53.         printf ("inserting at %d - %s -> %s\n", k, e[k].name, e[k + 1].name);
  54.     else
  55.         printf ("inserting 1st record %s\n", e[k].name);
  56. #endif
  57.     if (!wassorted && !same && current != index)
  58.         wassorted = 1;
  59.     if (!same)
  60.         e[k].index = current;
  61.     else
  62.         e[k].index = -1;
  63.     current++;
  64.     count++;
  65. }
  66.  
  67.  
  68. static void
  69. makesortname (buf, origname)
  70. char *buf, *origname;
  71. {
  72. char *cp;
  73.  
  74.     strcpy (buf, origname);
  75.     cp = strchr (buf, '.');
  76.     if (!cp)
  77.         cp = &buf[strlen(buf)];
  78.     strcpy (cp, ".srt");
  79. }
  80.  
  81. void
  82. sortit (fname, entrysize, searchsize, strsize, date)
  83. char *fname;
  84. int entrysize, searchsize, strsize;
  85. time_t date;
  86. {
  87. char *cp;
  88. unsigned k;
  89. FILE *fp, *out;
  90. char buf[128];
  91. long size;
  92. int num;
  93. time_t now, stamptime;
  94.  
  95. #ifdef TEST
  96.     printf ("Filename: '%s', Entrysize=%d, Searchsize=%d\n", fname, entrysize, searchsize);
  97. #endif
  98.     if ((fp = fopen (fname, "rt")) == 0)    {
  99. #ifdef TEST
  100.         printf ("can't open input file: %s\n", fname);
  101. #endif
  102.         return;
  103.     }
  104.     makesortname (buf, fname);
  105.     if ((out = fopen (buf, "wt")) == 0)    {
  106. #ifdef TEST
  107.         printf ("can't open output file: %s\n", buf);
  108. #endif
  109.         fclose (fp);
  110.         return;
  111.     }
  112.     size = filelength(fileno(fp));
  113.     size /= (long) entrysize;
  114.     size += 1;
  115. #ifdef TEST
  116.     printf ("%ld Entries found - Allocating structure...\n", size - 1);
  117. #endif
  118.     e = (struct entries *) malloc (size * sizeof(struct entries));
  119.     for (current = 0; current < size; current++)    {
  120.         e[current].name = (char *)malloc (searchsize + 1);
  121.         e[current].name[0] = 0;
  122.         e[current].index = -1;
  123.     }
  124.     current = count = 0;
  125.     expired = sortdups = wassorted = 0;
  126.     now = time(&now);
  127.     while (!feof (fp))    {
  128.         pwait (NULL);
  129.         fgets (buf, entrysize, fp);
  130. #ifdef TEST
  131.         printf ("Reading Entry %d/%d - ", current, count);
  132. #endif
  133.         if (feof (fp))
  134.             continue;
  135.         strncpy (name, buf, searchsize);
  136.         name[searchsize] = 0;
  137.         if ((cp = strpbrk (name, ".@ \t")) != 0)
  138.             *cp = 0;
  139.         search();
  140.         insert ();
  141.  
  142.         /* if invalid character at beginning, mark as bad */
  143.         if (*buf < ' ' || *buf == '$')
  144.             e[index].index = -2;
  145.         else    {
  146.             /* now check for expired date stamp, if used */
  147.             if (date)    {
  148.                 cp = strchr (buf, ' ');
  149.                 cp = skipwhite (cp);
  150.                 stamptime = atol(cp);
  151.                 if ((stamptime == 0) || (now - stamptime >= date))    {
  152. #ifdef TEST
  153.                     printf ("Expiring: now=%ld, age=%ld, stamptime=%ld\n", now, date, stamptime);
  154. #endif
  155.                     expired++;
  156.                     e[index].index = -2;
  157.                 }
  158.             }
  159.         }
  160.     }
  161. #ifdef TEST
  162.     putchar ('\n');
  163. #endif
  164.     fflush (stdout);
  165.     if (expired || wassorted || sortdups)        {
  166.         for (k = 0; k < count; k++)    {
  167.             if (e[k].index >= 0)    {
  168. #ifdef TEST
  169.                 printf ("Outputing record %d/%d\n", k, count);
  170. #endif
  171.                 pwait (NULL);
  172.                 fseek (fp, (long) ((long)e[k].index * (long)entrysize), 0);
  173.                 fgets (buf, entrysize, fp);
  174.  
  175.                 if (strsize)    {
  176.                     /* we now re-format it, just in case it is bad */
  177.                     if ((cp = strpbrk (buf, " \t")) != 0)
  178.                         *cp++ = 0;
  179.                     cp = skipwhite (cp);
  180.                     stamptime = atol(cp);
  181.                             fprintf(out,"%-*s %-14ld\n",strsize,buf,stamptime);
  182.                     } else
  183.                     fputs (buf, out);
  184.             }
  185. #ifdef TEST
  186.             else if (e[k].index == -2)
  187.                 printf ("Expiring record %d/%d\n", k, count);
  188.             else printf ("Skipping record %d/%d\n", k, count);
  189. #endif
  190.             
  191.         }
  192.     }
  193.     
  194.     fclose (fp);
  195.     fclose (out);
  196.     for (current = 0; current < size; current++)
  197.         free(e[current].name);
  198.     free (e);
  199.     makesortname (buf, fname);
  200.     if (expired || wassorted || sortdups)    {
  201.         remove (fname);
  202.         rename (buf, fname);
  203.     } else
  204.         remove (buf);
  205. }
  206.  
  207.  
  208.  
  209.  
  210. #ifdef DEMO
  211. #define ENTRYSIZE 49
  212.  
  213. int
  214. pwait (i)
  215. int i;
  216. {
  217.     return i;
  218. }
  219.  
  220.  
  221. char *
  222. skipwhite (cp)
  223. char *cp;
  224. {
  225.     while (*cp && (*cp == ' ' || *cp == '\t'))
  226.         cp++;
  227.     return (cp);
  228. }
  229.  
  230.  
  231. void
  232. main (argc, argv)
  233. int argc;
  234. char *argv[];
  235. {
  236. unsigned long begincore;
  237.  
  238.     begincore = coreleft();
  239.     if (argc == 1)
  240.         sortit ("/nos/spool/wpagebbs", ENTRYSIZE, 6, 0, (time_t)0);
  241.     else
  242.         sortit (argv[1], atoi (argv[2]), atoi(argv[3]), 0, (time_t) 0);
  243.     printf ("\nBeginning coreleft was %ld - Now is %ld\n", begincore, (long) coreleft());
  244.     if (!wassorted && !sortdups)
  245.         printf ("File was already sorted with no duplicates...\nNo further action needed\n");
  246.     else if (sortdups)
  247.         printf ("%d duplicates removed\n", sortdups);
  248. }
  249. #endif
  250.